home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD 2.1 / Amiga Developer CD v2.1.iso / Reference / DevCon / Washington_1988 / DevCon88.1 / JimmDemos / DemoSource / spr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-27  |  3.1 KB  |  115 lines

  1. /* spr.c -- easy sprites, sprite rastports
  2.  *
  3.  * Copyright (c) 1988, I and I Computing and Commodore-Amiga, Inc.
  4.  * 
  5.  * Executables based on this information may be used in software
  6.  * for Commodore Amiga computers.  All other rights reserved.
  7.  *
  8.  * This information is provided "as is"; no warranties are made.
  9.  * All use is at your own risk, and no liability or responsibility is assumed.
  10.  */
  11.  
  12. #include "sysall.h"
  13. #include "spr.h"
  14.  
  15. #define D( x )    ;
  16.  
  17. /* extra memory (in bytes ) allocated for control info and terminator    */
  18. #define SPMEM_EXTRA        ( 2 * sizeof (short int) + 2 *  sizeof (short int))
  19. #define SPMEM_BYTES( height )    (SPMEM_EXTRA+2*sizeof (short int) *(height))
  20.  
  21. /* word index to reserved at bottom    */
  22. #define SPMEM_RSRVD( height )     (2 + 2 * (height))
  23.  
  24. /*
  25.  * Allocates sprite requested, creates bitmap and
  26.  * rastport that can be used to render into sprite using
  27.  * standard graphics calls (Dale's trick).
  28.  *
  29.  * passed an already allocated SpritePortRast structure
  30.  * do not render in any but the leftmost 16 pixel columns
  31.  *
  32.  * returns sprite number
  33.  * if force, than unless you asked for "any sprite" (spritepick == -1),
  34.  * we'll steal your choice.
  35.  */
  36. initSPR( spr, height, spritepick, force )
  37. struct SpritePortRast    *spr;
  38. {
  39.     int         spnum;
  40.     UWORD        *sprdata;
  41.  
  42.     D( printf("iSPR: spr: %lx\n", spr) );
  43.     D( printf("iSPR: spritepick: %d\n", spritepick) );
  44.     D( printf( "height: %d, spmem_bytes: %d\n", height, SPMEM_BYTES(height)));
  45.  
  46.     if ( ((spnum = GetSprite( &spr->spr_SSprite, (LONG) spritepick )) != -1 )
  47.          || ((spritepick != -1) && force) )
  48.     {
  49.         /* I'm ignoring GetSprite    */
  50.         if ( spnum == -1 )
  51.         {
  52.             D( printf("force sprite.\n") );
  53.             spr->spr_SSprite.num = spnum = spritepick;
  54.             spr->spr_Flags |= SPRF_FORCED;
  55.         }
  56.         D( else printf("got sprite: spnum: %d\n", spnum ) );
  57.  
  58.         /* allocate chip mem    */
  59.         sprdata = (UWORD *)
  60.             AllocMem( (LONG) SPMEM_BYTES( height ), (LONG)MEMF_CHIP|MEMF_CLEAR );
  61.  
  62.         D( printf( "sprdata: %lx\n", sprdata ) );
  63.  
  64.         if ( spr->spr_Data = sprdata )
  65.         {
  66.             /* setup posctrl terminator    */
  67.             sprdata[ SPMEM_RSRVD( height ) ] =        0;
  68.             sprdata[ SPMEM_RSRVD( height ) + 1 ] =    0;
  69.  
  70.             /* set up weird bitmap    */
  71.             InitBitMap( &spr->spr_BMap, 2L,  32L, (LONG) height );
  72.  
  73.             spr->spr_BMap.Planes[ 0 ] =    (PLANEPTR) (sprdata + 2);
  74.             spr->spr_BMap.Planes[ 1 ] =    (PLANEPTR) (sprdata + 3);    /* trick */
  75.  
  76.             /* and rastport    */
  77.             InitRastPort( &spr->spr_RPort );
  78.             spr->spr_RPort.BitMap = &spr->spr_BMap;
  79.  
  80.             /* finish setup    */
  81.             spr->spr_Size = SPMEM_BYTES( height );
  82.             spr->spr_SSprite.height = height;
  83.         }
  84.         else
  85.         {
  86.             D( printf("calling freeSPR\n") );
  87.             freeSPR( spr );
  88.             spnum = -1;
  89.         }
  90.     }
  91.     D( printf("iSPR: pt2: spnum: %d\n", spnum) );
  92.  
  93.     if ( spnum == -1 ) spr->spr_Data = NULL;
  94.     spr->spr_SNum = spnum;
  95.     return ( spnum );
  96. }
  97.  
  98. /* note: doesn't free spr structure, just the sprite data    */
  99. freeSPR( spr )
  100. struct SpritePortRast    *spr;
  101. {
  102.     if ( ( spr->spr_SNum != -1 ) && !( spr->spr_Flags & SPRF_FORCED ) )
  103.     {
  104.         FreeSprite( (LONG) spr->spr_SNum );
  105.     }
  106.     if ( spr->spr_Data != NULL )
  107.     {
  108.         FreeMem( spr->spr_Data, (ULONG) spr->spr_Size );
  109.     }
  110.     spr->spr_Data = NULL;
  111.  
  112.     spr->spr_SNum = -1;
  113.     spr->spr_Size = 0;
  114. }
  115.